﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;

using MSO = Microsoft.Office.Core;
using OL = Microsoft.Office.Interop.Outlook;

using ConvergensInterfaces;
using ConvergensDominoConnector;

namespace ConvergensDominoConnector
{
    public class CDCOExplorerCommandBarButtonEvents : CDCOCommandBarButtonEvents
    {
        private OL.Application application;

        public CDCOExplorerCommandBarButtonEvents(OL.Application application)
        {
            this.application = application;
        }

        public void Journalize(MSO.CommandBarButton cmdBarbutton, ref bool cancel)
        {
            try
            {
                //Button from outlook window
                List<Object> selectedItemList = ItemSelector.ValidateActiveExplorerSelection(this.application);
                if (selectedItemList.Count == 0)
                {
                    throw new Exception("Der er ikke valgt nogen mail til journalisering.\nMarker en mail og prøv igen.");
                }

                if (selectedItemList.Count > 1)
                {
                    throw new Exception("Der kan kun journaliseres en mail af gangen.\nMarker kun en mail og prøv igen.");
                }

                foreach (object obj in selectedItemList)
                {
                    if (obj is OL.AppointmentItem)
                    {
                        throw new Exception("Denne Outlook objekt type kan ikke journaliseres.\n\nOutlook objekt type: AppointmentItem");
                    }
                    else if (obj is OL.ContactItem)
                    {
                        throw new Exception("Denne Outlook objekt type kan ikke journaliseres.\n\nOutlook objekt type: ContactItem");
                    }
                    else if (obj is OL.JournalItem)
                    {
                        throw new Exception("Denne Outlook objekt type kan ikke journaliseres.\n\nOutlook objekt type: JournalItem");
                    }
                    else if (obj is OL.MailItem)
                    {
                        DominoConnector.Default.journalizeMailItem((OL.MailItem)selectedItemList[0]);
                    }
                    else if (obj is OL.NoteItem)
                    {
                        throw new Exception("Denne Outlook objekt type kan ikke journaliseres.\n\nOutlook objekt type: NoteItem");
                    }
                    else if (obj is OL.PostItem)
                    {
                        throw new Exception("Denne Outlook objekt type kan ikke journaliseres.\n\nOutlook objekt type: PostItem");
                    }
                    else if (obj is OL.RemoteItem)
                    {
                        throw new Exception("Denne Outlook objekt type kan ikke journaliseres.\n\nOutlook objekt type: RemoteItem");
                    }
                    else if (obj is OL.ReportItem)
                    {
                        throw new Exception("Denne Outlook objekt type kan ikke journaliseres.\n\nOutlook objekt type: ReportItem");
                    }
                    else if (obj is OL.TaskItem)
                    {
                        throw new Exception("Denne Outlook objekt type kan ikke journaliseres.\n\nOutlook objekt type: TaskItem");
                    }
                    else if (obj is OL.TaskRequestItem)
                    {
                        throw new Exception("Denne Outlook objekt type kan ikke journaliseres.\n\nOutlook objekt type: TaskRequestItem");
                    }
                    else if (obj is OL.DistListItem)
                    {
                        throw new Exception("Denne Outlook objekt type kan ikke journaliseres.\n\nOutlook objekt type: DistListItem");
                    }
                    else if (obj is OL.DocumentItem)
                    {
                        throw new Exception("Denne Outlook objekt type kan ikke journaliseres.\n\nOutlook objekt type: DocumentItem");
                    }
                    else if (obj is OL.MeetingItem)
                    {
                        throw new Exception("Denne Outlook objekt type kan ikke journaliseres.\n\nOutlook objekt type: MeetingItem");
                    }
                    else if (obj is OL.SharingItem)
                    {
                        throw new Exception("Denne Outlook objekt type kan ikke journaliseres.\n\nOutlook objekt type: SharingItem");
                    }
                    else if (obj is OL.StorageItem)
                    {
                        throw new Exception("Denne Outlook objekt type kan ikke journaliseres.\n\nOutlook objekt type: StorageItem");
                    }
                    else if (obj is OL.TaskRequestAcceptItem)
                    {
                        throw new Exception("Denne Outlook objekt type kan ikke journaliseres.\n\nOutlook objekt type: TaskRequestAcceptItem");
                    }
                    else if (obj is OL.TaskRequestDeclineItem)
                    {
                        throw new Exception("Denne Outlook objekt type kan ikke journaliseres.\n\nOutlook objekt type: TaskRequestDeclineItem");
                    }
                    else if (obj is OL.TaskRequestItem)
                    {
                        throw new Exception("Denne Outlook objekt type kan ikke journaliseres.\n\nOutlook objekt type: TaskRequestItem");
                    }
                    else if (obj is OL.TaskRequestUpdateItem)
                    {
                        throw new Exception("Denne Outlook objekt type kan ikke journaliseres.\n\nOutlook objekt type: TaskRequestUpdateItem");
                    }
                    else
                    {
                        throw new Exception("Tillykke :) \n\nDet burde ikke være muligt at få denne fejlbesked.\n"+
                        "Nu har jeg uden held forsøgt at journalisere følgende Outlook objekt typer:\n\n"+
                        "AppointmentItem\n"+
                        "ContactItem\n"+
                        "DistListItem\n"+
                        "DocumentItem\n"+
                        "JournalItem\n"+
                        "MailItem\n"+
                        "MeetingItem\n"+
                        "NoteItem\n"+
                        "PostItem\n"+
                        "RemoteItem\n"+
                        "ReportItem\n"+
                        "SharingItem\n"+
                        "StorageItem\n"+
                        "TaskItem\n"+
                        "TaskRequestAcceptItem\n"+
                        "TaskRequestDeclineItem\n"+
                        "TaskRequestItem\n"+
                        "TaskRequestUpdateItem\n"+"\n\nOutlook objekt type: Ukendt");
                    }
                } 

            }
            catch (System.Runtime.InteropServices.COMException cx)
            {
                if (cx.ErrorCode == -2147467259)
                {
                    //Suppress
                    return;
                }

                MessageBox.Show(cx.Message, "Convergens Domino Connector for Outlook", MessageBoxButtons.OK, MessageBoxIcon.Error);
            
            }
            catch (ApplicationException ex)
            {
                MessageBox.Show(ex.Message, "Convergens Domino Connector for Outlook", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Convergens Domino Connector for Outlook", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
    }
}
